package com.dragon.modules.yuegou.service.coupon;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dragon.common.web.PageRequest;
import com.dragon.modules.yuegou.entity.coupon.CouponEntity;
import com.dragon.modules.yuegou.enums.CouponStatus;
import com.dragon.modules.yuegou.enums.coupon.CouponSourceType;
import com.dragon.modules.yuegou.enums.coupon.CouponType;
import com.dragon.modules.yuegou.model.coupon.Coupon;
import com.dragon.modules.yuegou.model.coupon.CouponTemplate;
import com.dragon.modules.yuegou.model.coupon.CouponUserList;
import com.dragon.modules.yuegou.model.coupon.ReceiveDetail;
import com.dragon.modules.yuegou.model.coupon.Welfare;
import com.dragon.modules.yuegou.model.order.Order;
import com.dragon.modules.yuegou.model.product.Sku;
import com.dragon.modules.yuegou.model.system.Document;
import com.dragon.modules.yuegou.query.coupon.CouponQuery;
import com.dragon.modules.yuegou.query.coupon.ReceiveDetailRequest;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * 优惠券（会员的优惠券，不冗余优惠券模板信息，请使用1+N模式查询） 服务接口
 *
 * @author pbuilder generated
 * @date 2019-10-13 15:09:43
 * @version 2.0
 */
public interface CouponService extends IService<CouponEntity> {

	/**
	 * 获取会员优惠券发放记录：分页查询
	 * 
	 * @param page
	 * @param query
	 * @return
	 */
	IPage<Coupon> couponRecords(PageRequest page, CouponQuery query);

	/**
	 * 获取优惠券详情<br>
	 * <p>
	 * 所有提到“优惠券详情”的地方，优惠券数据结构与此处一致：<br>
	 * 优惠券详情信息包括：优惠券基本信息、优惠券模板信息
	 * </p>
	 * 
	 * @param id
	 *            优惠券ID
	 * @return 优惠券详情
	 */
	Coupon loadDetailById(String id);

	/**
	 * 根据优惠券ID结合查询优惠券详情列表
	 * 
	 * @param ids
	 *            优惠券ID集合
	 * @return 优惠券详情列表
	 */
	List<Coupon> listDetailByIds(Collection<String> ids);

	/**
	 * 列出对一系列商品可用的优惠券
	 * 
	 * @param memberId
	 *            会员ID
	 * @param skuIds
	 *            SKU ID列表
	 * @return 该会员可用用于这些商品的优惠券
	 */
	List<Coupon> listAvaliableCoupons(String memberId, Collection<String> skuIds);

	/**
	 * 列出在停车场可用的优惠券（停车券）
	 * 
	 * @param memberId
	 *            会员ID
	 * @param parkId
	 *            停车场ID
	 * @param parkFee
	 *            停车费用
	 * @return 该会员可用用于这些商品的优惠券
	 */
	List<Coupon> listParkCoupons(String memberId, String parkId, BigDecimal parkFee);

	/**
	 * 分配优惠金额<br>
	 * 
	 * @param couponIds
	 *            优惠券ID列表
	 * @param skuIds
	 *            SKU ID列表
	 * @param amount
	 *            订单总额
	 * @return 分配的优惠券详情列表，每个优惠券分配好了优惠金额
	 */
	List<Coupon> allocateCoupons(Collection<String> couponIds, Collection<String> skuIds, BigDecimal amount);

	/**
	 * 分配停车券优惠金额<br>
	 * 
	 * 
	 * @param couponIds
	 *            优惠券ID列表
	 * @param parkId
	 *            停车场ID
	 * @param amount
	 *            订单总额
	 * @return 分配的优惠券详情列表，每个优惠券分配好了优惠金额
	 */
	List<Coupon> allocateParkCoupons(Collection<String> couponIds, String parkId, BigDecimal amount);

	/**
	 * 使用优惠券<br>
	 * 把优惠券标记为已使用
	 * 
	 * @param couponIds
	 *            优惠券ID列表
	 */
	void useCoupons(Order order, List<String> couponIds, Boolean isNotify);

	/**
	 * 让优惠券失效
	 * 
	 * @param couponId
	 *            优惠券ID
	 * @return true表示成功标记为失效，false表示标记失败（不能标记为已失效，或者本身就是已失效的）
	 */
	boolean expireCoupon(String couponId);

	/**
	 * 恢复优惠券<br>
	 * 把优惠券标记为未使用
	 * 
	 * @param couponIds
	 *            优惠券ID列表
	 */
	void recoverCoupons(List<String> couponIds);

	/**
	 * 给会员创建优惠券<br>
	 * 注意：本方法不负责扣库存
	 *
	 * @param orderNo
	 *            订单号
	 * @param memberId
	 *            会员
	 * @param couponTemplateId
	 *            优惠券模板ID
	 * @param type
	 *            券来源类型
	 * @return 优惠券
	 */
	Coupon createCoupon(String orderNo, String memberId, String couponTemplateId, CouponSourceType type);
	
	Coupon createCoupon(String orderNo, String memberId,String merchantId, String couponTemplateId, CouponSourceType type);

	/**
	 * 给会员创建优惠券<br>
	 * 注意：本方法不负责扣库存
	 * 
	 * @param orderNo
	 *            订单号
	 * @param memberId
	 *            会员
	 * @param couponTemplateIds
	 *            优惠券模板ID
	 * @return 优惠券列表
	 */
	List<Coupon> bachCreateCoupon(String orderNo, String memberId, List<String> couponTemplateIds);

	/**
	 * 批量给会员创建优惠券
	 * 
	 * @param memberIds
	 *            会员ID
	 * @param couponTemplateId
	 *            优惠券模板ID
	 * @return
	 */
	int bachCreateCoupon(Set<String> memberIds, String couponTemplateId, String taskName);

	/**
	 * 批量给会员创建优惠券
	 *
	 * @param memberIds
	 *            会员ID
	 * @param couponTemplateId
	 *            优惠券模板ID
	 * @return
	 */
	List<Coupon> issueCoupon(Set<String> memberIds, String couponTemplateId, String taskName,Integer num);

	/**
	 * 根据不同状态获取会员优惠券
	 * 
	 * @param page
	 * @param busdId
	 * @return
	 */
	IPage<Coupon> getMemberParkCouponList(PageRequest page, String busdId, String memberId, CouponStatus status);

	/**
	 * 根据订单号查询停车券
	 * 
	 * @param orderNo
	 * @return
	 */
	Coupon getByOrderNo(String orderNo);

	void saveWelfare(Welfare welfare);

	/**
	 * 获取商圈下的优惠券模板
	 * 
	 * @param busdId
	 * @return
	 */
	List<CouponTemplate> getCouponList(String busdId);

	/**
	 * 根据福利ID获取会员福利信息
	 * 
	 * @param id
	 * @return
	 */
	Welfare getWelfare(String id);

	/**
	 * 停车使用停车券
	 * 
	 * @param couponId
	 */
	void parkUseCoupons(Order order, String couponId,Boolean isNotify);

	/**
	 * 统计优惠券作废人数
	 */
	void getInvalidNum(List<String> coupon);

	/**
	 * 获取会员的优惠券的最优项
	 */
	List<Coupon> getBestCoupon(String busdId, String memberId, BigDecimal orderFee, List<Sku> skuList);
	
	/**
	 * @param id 优惠劵模板Id
	 * @param mobile 会员电话
	 * @return
	 */
	List<CouponUserList> couponUserList(String id, String mobile);

	/**
	 * 筛选券模板的可用商品列表
	 * @return
	 */
	List<Sku> getCouponSkuList(CouponTemplate couponTemplate, List<Sku> skuList);
	
	/**
	 * @param page 分页信息
	 * @param request 查询条件
	 * @return
	 */
	IPage<ReceiveDetail> receiveDetail(PageRequest page, ReceiveDetailRequest request);

	/**
	 * @param request 查询条件
	 * @return
	 */
	Document exportReceiveData(ReceiveDetailRequest request);

	/**
	 *  现金劵预警提醒
	 */
	void expiryWarning();

	/**
	 * 优惠券数量
	 * @param busdId
	 * @param memberId
	 * @param couponType
	 * @return
	 */
	Long couponNum(String busdId, String memberId, CouponType couponType);
}
